package com.xinwei.leetcode.链表;


import com.xinwei.linearExercise.List;

// https://leetcode-cn.com/problems/remove-linked-list-elements/

/**
 * 总结：链表中，在当前节点删除当前节点的元素比较困难，所以在递归时往用preNode来递归 
 */
public class _203_移除链表元素 {
    public static ListNode removeElements(ListNode head, int val) {
        if (head == null || head.next == null) return head;
        ListNode node = head;
        while (node != null) {
            if (null == node.next.next) {
                if (node.val == val) {
                    node.val = node.next.val;
                    node.next = node.next.next;

                    }

                if (node.next.val == val){
                    node.next = null;
                }
                break;
            }
            node = node.next;
        }
        return head;
    }

    // 递归
    public ListNode removeElements1(ListNode head, int val) {
        ListNode node = head;

        //常规
        if (node.next.val == val) {
            node.next = node.next.next;
        }


        // 最后边界
        if (node.next.val == val) {
            node.next = null;
        }
        return null;
    }

    // 迭代
    public ListNode removeElements2(ListNode head, int val) {
        ListNode dummyHead = new ListNode(0);
        dummyHead.next = head;
        ListNode prev = dummyHead;
        // 判断当前结点的后继结点是否为null
        while (prev.next != null) {
            // 如果当前结点的后继结点的值与给定值val相等
            // 则需将其后继结点删除
            if (prev.next.val == val) {
                // 通过将当前结点后继结点的后继结点挂在当前结点之后
                // 来删除当前结点的后继结点
                prev.next = prev.next.next;
            } else {
                // 如果当前结点的后继结点的值与给定值不相等
                // 则当前结点需要保留，因此prev向前移动一个位置
                prev = prev.next;
            }
        }
        return dummyHead.next;
    }
}
